iT邦幫忙

2023 iThome 鐵人賽

DAY 9
0
Software Development

30 天到底能寫多少 Leetcode系列 第 9

[Day9] 念 DP 從 0-1 背包開始

  • 分享至 

  • xImage
  •  

每天固定念一種類型的題目,結果清單裡待寫但還沒寫的題目越來越多了QQ
接下來會念一陣子的 DP,估計要花上一到兩週的時間,最後再用圖論的東西來收尾。

今天要看的是 DP 背包問題中最基礎的 0-1 背包。

0-1 背包是在條件限制(有限容量)下去最大化收益(物品價值),基本做法就是開二維陣列,一個維度是容量,另一個維度是物品選取狀況,記錄「在可以選取前 i 項物品時,限重 j 能獲取的最大價值」。大概記得這點,然後寫出二維的轉移矩陣就完成了,hard 題可能需要開到三維,轉移矩陣的限制也會變多。

416. Partition Equal Subset Sum 這題其實不用寫 dp 矩陣,只需要 dp 的核心概念:記錄每個選擇和選擇的後果。每個物品可以選或不選,然後記載所有的可能性,判斷是否符合題目要求就好了。

class Solution:
    def canPartition(self, nums: List[int]) -> bool:
        if sum(nums) % 2 == 1:
            return False
        target = sum(nums) / 2

        s = set()
        s.add(0)

        for i in nums:
            tmp = list(s)
            if target in tmp:
                return True
            for j in tmp:
                s.add(j+i)

        return target in tmp



  • Total Count: 10
    • 是今天剛好都挑到 easy 題嗎,寫 dp 居然比前幾天順手我完全沒想過 (゚д゚≡゚д゚)
    • 然後刷題小目標快沒救了(メ ゚皿゚)メ

上一篇
[Day8] 其實很常見的 Trie tree
下一篇
[Day10] 從 0-1 背包進化到完全背包
系列文
30 天到底能寫多少 Leetcode21
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言